//package com.hmall.search.config;
//
//import cn.hutool.core.bean.BeanUtil;
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.json.JSONUtil;
//import com.alibaba.fastjson.JSON;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.hmall.search.domain.es.ItemEs;
//import com.hmall.search.domain.vo.Item;
//
//import com.hmall.search.domain.vo.ItemDoc;
//import com.hmall.search.mapper.ItemEsSyncMapper;
//import com.hmall.search.service.SearchService;
//import lombok.RequiredArgsConstructor;
//import org.elasticsearch.client.RequestOptions;
//import org.elasticsearch.xcontent.XContentType;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
//import org.springframework.data.elasticsearch.core.IndexOperations;
//import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
//import org.springframework.data.elasticsearch.core.query.IndexQuery;
//
//import javax.annotation.PostConstruct;
//import java.io.IOException;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.concurrent.*;
//import java.util.stream.Collectors;
//
//
//@Configuration
//@RequiredArgsConstructor
//public class SyncItemEsConfig {
//
//    private final SearchService searchService;
//
//    private final ElasticsearchRestTemplate elasticsearchRestTemplate;
//
//
//    // 创建一个 IO 密集型线程池，线程数为 CPU 核心数 * 2
//    private final ExecutorService executor = new ThreadPoolExecutor(
//            Runtime.getRuntime().availableProcessors() * 2,
//            Runtime.getRuntime().availableProcessors() * 2 * 2,
//            60L, TimeUnit.SECONDS,
//            new LinkedBlockingQueue<>(Runtime.getRuntime().availableProcessors() * 2 * 10),
//            new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略：让调用者执行任务
//    );
//
//    @PostConstruct
//    public void init() throws InterruptedException {
//        // 获取索引操作对象
//        IndexOperations indexOps = elasticsearchRestTemplate.indexOps(ItemEs.class);
//        if (!indexOps.exists()) {
//            indexOps.create();
//            indexOps.putMapping(indexOps.createMapping()); // 应用 @Field 映射（包含 ik 分词）
//        }
//        bulkImportItems();
//    }
//
//    public void bulkImportItems() throws InterruptedException {
//        int size = 1000;
//        long lastId = 0; // 记录 ID 范围分页
//
//        // ⚡ 线程安全的队列，存储异步任务
//        ConcurrentLinkedQueue<CompletableFuture<Void>> futures = new ConcurrentLinkedQueue<>();
//        // 记录开始时间
//        long startTime = System.currentTimeMillis();
//
//        while (true) {
//            // 分页查询商品数据
//            List<Item> items = searchService.lambdaQuery()
//                    .eq(Item::getStatus, 1)
//                    .gt(Item::getId, lastId)
//                    .orderByAsc(Item::getId)
//                    .last("limit " + size)
//                    .list();
//
//            if (CollUtil.isEmpty(items)) {
//                break; // 没有数据，跳出循环
//            }
//            lastId = items.get(items.size() - 1).getId(); // 更新 lastId
//
//
//            // 提交批量任务到线程池
//            CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
//                bulkIndexItems(items); // 直接传递查询到的 items
//            }, executor);
//            futures.add(future); // ⚡ 使用 ConcurrentLinkedQueue 添加任务
//        }
//
//        // 等待所有任务完成
//        CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
//        // 记录结束时间
//        long endTime = System.currentTimeMillis();
//
//        // 计算并输出耗时
//        long duration = endTime - startTime;
//        System.out.println("批量导入操作完成，耗时: " + duration + " 毫秒");
//
//        // 关闭线程池
//        executor.shutdown();
//    }
//
//    private void bulkIndexItems(List<Item> items) {
//        List<IndexQuery> indexQueries = items.stream().map(item -> {
//            IndexQuery query = new IndexQuery();
//            query.setId(item.getId().toString());
//            ItemEs itemEs = BeanUtil.copyProperties(item, ItemEs.class);
//            query.setObject(itemEs);
//            return query;
//        }).collect(Collectors.toList());
//        // 批量插入数据
//        elasticsearchRestTemplate.bulkIndex(indexQueries, IndexCoordinates.of("items"));
//    }
//}
